/*global pi, ArrayBuffer */
pi.mod.define('pi.render.t3d', function (pi) {
	"use strict";
	var module = {},
		t3d = [
			/**
			 * 创建窗口渲染环境
			 * windowHandle: 整型，窗口句柄
			 * 返回：整型，渲染环境句柄，失败返回0
			 */
			// module.createContext (windowHandle)
			["t3d_context_new", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT], "createContext"],

			/**
			 * 创建纹理渲染环境
			 * width: 整型，目标纹理的宽度，单位：像素
			 * height: 整型，目标纹理的高度，单位：像素
			 * 返回：整型，渲染环境句柄，失败返回0
			 */
			// module.createTexContext (width, height)
			["t3d_tex_context_new", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT], "createTexContext"],

			// module.contextGetTex (context)
			["t3d_context_get_tex", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT], "contextGetTex"],

			/**
			 * 销毁渲染环境
			 * height: 整型，目标纹理的高度，单位：像素
			 * 返回：整型，渲染环境句柄，失败返回0
			 */
			// module.destroyContext (context)
			["t3d_context_free", pi.vcall.TYPE_VOID, [pi.vcall.TYPE_INT], "destroyContext"],

			/**
			 * 创建空图像，格式argb
			 * width, height：宽、高
			 */
			// module.createImg (width, height)
			["t3d_image_new", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT], "createImg"],

			/**
			 * 原始数据变图像
			 * 返回：整型，图像句柄，失败返回0
			 * data: 整型，vfs模块读到的文件数据句柄
			 * size: 整型，data所含的字节数
			 */
			// module.loadImg = function (data, size) {
			["t3d_image_load", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT], "loadImg"],

			// module.getImgHandle (img)
			["t3d_image_handle", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT], "getImgHandle"],


			/**
			 * 返回图像的宽度
			 * 返回：整型，图像的宽度
			 * img: int, 图像句柄
			 */
			// module.getImgWidth (img)
			["t3d_image_width", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT], "getImgWidth"],

			/**
			 * 返回图像的高度
			 * 返回：整型，图像的高度
			 * img: int, 图像句柄
			 */
			// module.getImgHeight (img)
			["t3d_image_height", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT], "getImgHeight"],

			["t3d_image_hue", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT, pi.vcall.TYPE_INT, pi.vcall.TYPE_INT]],

			["t3d_image_bright", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT, pi.vcall.TYPE_INT, pi.vcall.TYPE_INT]],

			["t3d_image_gray", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT, pi.vcall.TYPE_INT]],

			/**
			 * 销毁图像
			 * img: 整型; 图像句柄
			 * 无返回值
			 */
			// module.destroyImg (img) {
			["t3d_image_free", pi.vcall.TYPE_VOID, [pi.vcall.TYPE_INT], "destroyImg"],

			["t3d_image_save", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT, pi.vcall.TYPE_STRING, pi.vcall.TYPE_INT, pi.vcall.TYPE_INT]],

			/**
			 * 将图片变纹理
			 * img，整型，图片句柄
			 * 返回：整型，纹理句柄，失败返回0
			 * 注意：必须在渲染线程完成
			 */
			// module.loadTex = function (img) {
			["t3d_tex_load", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT], "loadTex"],

			/**
			 * 创建空纹理
			 * width, height: int, 宽、高，单位：像素
			 * 返回：整型，纹理句柄，失败返回0
			 * 注意：必须在渲染线程完成
			 */
			// module.createTex = function (width, height) {
				["t3d_tex_new", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT], "createTex"],

			["t3d_tex_update", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT]],

			/**
			 * 取纹理的宽度
			 * tex：int，纹理句柄
			 * 返回：int，纹理宽度
			 */
			// module.getTexWidth (tex)
			["t3d_tex_width", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT], "getTexWidth"],
			/**
			 * 取纹理的高度
			 * tex：int，纹理句柄
			 * 返回：int，纹理高度
			 */
			// module.getTexHeight (tex)
			["t3d_tex_height", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT], "getTexHeight"],

			/**
			 * 销毁纹理
			 * tex，整型，纹理句柄
			 * 注意：必须在渲染线程完成
			 */
			// module.destroyTex (tex)
				["t3d_tex_free", pi.vcall.TYPE_VOID, [pi.vcall.TYPE_INT], "destroyTex"],

			/**
			 * 纹理变图像
			 * tex，整型，纹理句柄
			 * 返回：整型，图像句柄，失败返回0
			 * 注意：必须在渲染线程完成
			 */
			// module.getTexImage = function (tex)
			["t3d_tex_get_image", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT], "getTexImage"],
			/**
			 * 创建字体
			 * name，字符串，字体名称
			 * size，整型，字体大小
			 * param：ArrayBuffer，字体参数，约定协议：
			 * 返回：整型，字体句柄，失败返回0
			 */
			// module.createFont (name, size, param) {
			["t3d_font_new", pi.vcall.TYPE_INT, [pi.vcall.TYPE_STRING, pi.vcall.TYPE_INT, pi.vcall.TYPE_POINTER], "t3d_font_new"],


			/**
			 * 销毁字体
			 * font，整型，字体句柄
			 */
			// module.destroyFont (tex)
			["t3d_font_free", pi.vcall.TYPE_VOID, [pi.vcall.TYPE_INT], "destroyFont"],

			/**
			 * 创建天空盒
			 * 返回：整型，天空盒句柄，失败返回0
			 */
			// module.createSkybox ()
			["t3d_skybox_new", pi.vcall.TYPE_INT, [], "createSkybox"],

			/**
			 * 销毁天空盒
			 * skybox：整型，天空盒句柄
			 */
			// module.destroySkybox (skybox)
			["t3d_skybox_free", pi.vcall.TYPE_VOID, [pi.vcall.TYPE_INT], "destroySkybox"],

			/**
			 * 创建地形
			 * width：int，宽度，单位：块
			 * depth: int，深度，单位：块
			 * posTable: RefResource, 弯曲地形位置数据，共3 * width * depth字节
			 * sx: float, 宽度度每单位代表多少像素
			 * sy: float, 高度度每单位代表多少像素
			 * sz: float, 深度度度每单位代表多少像素
			 * 返回：int，地形句柄，失败返回0
			 */
			// module.createTerrain (width, depth, posTable, sx, sy, sz)
			["t3d_terrain_new", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT, pi.vcall.TYPE_INT, pi.vcall.TYPE_FLOAT, pi.vcall.TYPE_FLOAT, pi.vcall.TYPE_FLOAT], "createTerrain"],

			/**
			 * 销毁地形
			 * terrain: 整型，地形句柄
			 */
			// module.destroyTerrain (terrain)
			["t3d_terrain_free", pi.vcall.TYPE_VOID, [pi.vcall.TYPE_INT], "destroyTerrain"],

			/**
			 * 进行渲染计算
			 * context: 整型，渲染环境句柄
			 * paramBuf: 整型，PiBytes数组，计算用的东西
			 * 返回：整型，PiBytes数组，渲染用的东西
			 */
			// module.calculate (context, paramBuf)
			["t3d_context_calc", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT], "calculate"],

			/**
			 * 进行渲染计算
			 * context: 整型，渲染环境句柄
			 * paramBuf: 整型，PiBytes数组，渲染用的东西
			 * 返回：boolean，是否成功
			 */
			// module.render (context, paramBuf)
			["t3d_context_render", pi.vcall.TYPE_VOID, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT], "render"],

			/* 取平截头体的结构体的字节大小 */
			// module.getFrustumByteSize ()
			["t3d_get_frustum_structsize", pi.vcall.TYPE_INT, [], "getFrustumByteSize"]

		],

		mesh = [

			/**
			 * 创建网格
			 * gType: int, 几何类型，值是module.GEO_TYPE_*之一
			 * iType: int, 索引类型，值是module.INDEX_TYPE_*之一
			 * numVertex：int，顶点数量
			 * pos: pointer, 位置数组，共3 * numVertex个元素，每个元有3个浮点数
			 * color: pointer, 颜色数组，共3 * numVertex个元素，每个元有4个char值，argb
			 * numIndex: 索引个数，无索引传0
			 * indexs: pointer，索引数据，共numIndex个索引，每个索引的字节数由iType指定
			 * 返回：整型，网格句柄，失败返回0
			 */
			// module.createMesh (gType, iType, numVertex, pos, color, numIndex, indexs) {
			["pi_mesh_create", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT, pi.vcall.TYPE_INT, pi.vcall.TYPE_POINTER, pi.vcall.TYPE_POINTER, pi.vcall.TYPE_INT, pi.vcall.TYPE_POINTER], "createMesh"],

			/**
			 * 加载网格
			 * data：整型，二进制数据
			 * size: 字节数
			 * 返回：整型，网格句柄，失败返回0
			 */
			// module.loadMesh (data, size)
			["pi_mesh_load", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT], "loadMesh"],

			/**
			 * 销毁网格
			 * mesh：整型，网格句柄
			 */
			// module.destroyMesh (mesh)
			["pi_mesh_free", pi.vcall.TYPE_VOID, [pi.vcall.TYPE_INT], "destroyMesh"],

			/**
			 * 创建骨骼
			 * data：整型，二进制数据
			 * size: 字节数
			 * 返回：整型，骨骼句柄，失败返回0
			 */
			// module.createSkeleton (data, size)
			["pi_skeleton_new", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT], "createSkeleton"],

			/**
			 * 销毁骨骼
			 * sk：整型，骨骼句柄
			 */
			// module.destroySkeleton (sk)
			["pi_skeleton_free", pi.vcall.TYPE_VOID, [pi.vcall.TYPE_INT], "destroySkeleton"]
		];

	// 注册所有 vcall 函数句柄
	pi.vcall.makeVCall("t3d.dll", module, t3d);
	pi.vcall.makeVCall("pi_mesh.dll", module, mesh);

	// 使图像的变为灰度图
	module.IMAGE_GRAY = 1;
	// 调整图像的明亮度
	module.IMAGE_BRIGHT = 2;
	// 调整图像的色相
	module.IMAGE_HUE = 3;

	// 图片文件的类型
	module.IMAGE_TYPE_PNG = 0;
	module.MAGE_TYPE_JPG = 1;
	module.IMAGE_TYPE_BMP = 2;

	// 点列表
	module.GEO_TYPE_POINT_LIST = 1;
	// 线列表
	module.GEO_TYPE_LINE_LIST = 2;
	// 线带
	module.GEO_TYPE_LINE_STRIP = 3;
	// 三角形列表
	module.GEO_TYPE_TRIANGLE_LIST = 4;
	// 三角形带
	module.GEO_TYPE_TRIANGLE_STRIP = 5;
	// 三角形扇
	module.GEO_TYPE_TRIANGLE_FAN = 6;
	// 四边形列表
	module.GEO_TYPE_QUAD_LIST = 7;

	// 16位索引
	module.INDEX_TYPE_16BIT = 1;
	// 32位索引
	module.INDEX_TYPE_32BIT = 2;

	/**
	 * 将图像img在alpha值范围是(alpha1, alpha2)的像素的色相值调整value
	 * 返回：boolean, 表示是否成功
	 * img: int，图像句柄
	 * alpha1，alpha2：intt，0 <= alpha1 <= alpha2 <= 255
	 * value:  int, [0, 360]
	 */
	module.hueImg = function (img, alpha1, alpha2, value) {
		return 1 === t3d.t3d_image_hue(img, alpha1, alpha2, value);
	};

	/**
	 * 将图像img在alpha值范围是(alpha1, alpha2)的像素的亮度值调整value
	 * 返回：boolean, 表示是否成功
	 * img: int，图像句柄
	 * alpha1，alpha2：intt，0 <= alpha1 <= alpha2 <= 255
	 * value:  int, [-100, 100]
	 */
	module.brightImg = function (img, alpha1, alpha2, value) {
		return 1 === t3d.t3d_image_bright(img, alpha1, alpha2, value);
	};

	/**
	 * 将图像img在alpha值范围是(alpha1, alpha2)的像素变灰色
	 * 返回：boolean, 表示是否成功
	 * img: int，图像句柄
	 * alpha1，alpha2：intt，0 <= alpha1 <= alpha2 <= 255
	 */
	module.grayImg = function (img, alpha1, alpha2) {
		return 1 === t3d.t3d_image_gray(img, alpha1, alpha2);
	};

	/**
	 * 保存图像image到文件fileName
	 * 返回：boolean
	 * ing：整型，图片句柄
	 * type: 整型，要保存的文件类型，值见IMAGE_TYPE_*
	 * 当文件类型为jpg时候，flag表示图片的质量，值为1到100，越高表示质量越好
	 */
	module.saveImg = function (img, fileName, type, flag) {
		return t3d.t3d_image_save(img, fileName, type, flag) === 0;
	};

	/** 用图片更新纹理
	 *	tex：纹理句柄
	 *	img: 图片句柄
	 *	返回：boolean, 是否成功
	 */
	module.updateTex = function (tex, img) {
		return t3d.t3d_tex_update(tex, img) === 1;
	};

	return module;
});